sources <- c("CBS", "ESPN", "FantasyData", "FantasyPros",
             "FantasySharks", "FleaFlicker", "Yahoo",
             "FantasyFootballNerd", "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos=c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 308.967 sec elapsed

Results

sim_lu %>%
  filter(lineup<=3) %>%
  arrange(lineup, position, desc(pts_pred)) %>%
  knitr::kable() %>%
  kable_styling() %>%
  column_spec(1, bold=TRUE) %>%
  collapse_rows(columns = 1, valign = 'top')
lineup Name team position pts_base pts_pred sd_pts Salary
1 Cam Newton NEP QB 24.36100 26.826575 1.8280458 7700
Miles Sanders PHI RB 16.56000 17.143147 1.0414882 7400
Jonathan Taylor IND RB 16.04500 16.097661 0.1630860 6700
Kenyan Drake ARI RB 14.51099 14.867883 0.2342791 6500
DeAndre Hopkins ARI WR 17.70000 18.648671 1.1267760 8500
Calvin Ridley ATL WR 15.98500 16.512140 1.8977280 8000
Darius Slayton NYG WR 12.08000 12.551311 1.6012080 5500
Zach Ertz PHI TE 10.71500 10.548818 0.2372160 6200
Carolina Panthers CAR DST 6.07500 9.371659 1.7791200 3500
2 Kyler Murray ARI QB 24.97400 24.837174 0.9636900 8400
Miles Sanders PHI RB 16.56000 17.634572 1.0414882 7400
David Johnson HOU RB 11.29750 16.160706 2.6983320 6900
Jonathan Taylor IND RB 16.04500 15.885759 0.1630860 6700
DeAndre Hopkins ARI WR 17.70000 18.797947 1.1267760 8500
DK Metcalf SEA WR 13.78743 14.094513 1.9571002 6500
N’Keal Harry NEP WR 8.95000 11.719869 3.7361520 5300
Darren Waller LVR TE 10.66893 12.759700 2.3440979 6600
Houston Texans HOU DST 6.10000 8.422297 1.1860800 3600
3 Kyler Murray ARI QB 24.97400 25.130595 0.9636900 8400
Ezekiel Elliott DAL RB 19.18000 19.196092 0.3085588 9000
Jonathan Taylor IND RB 16.04500 15.979572 0.1630860 6700
Kenyan Drake ARI RB 14.51099 14.438728 0.2342791 6500
Calvin Ridley ATL WR 15.98500 16.692310 1.8977280 8000
Tyler Lockett SEA WR 13.62361 14.012778 0.7157616 6800
Darius Slayton NYG WR 12.08000 12.203998 1.6012080 5500
Jordan Reed SFO TE 9.75250 9.789776 0.2075640 5300
Tampa Bay Buccaneers TBB DST 7.80000 8.019521 0.1482600 3800
ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
sim_lu %>%
  group_by(lineup) %>%
  mutate(lineup_pts=sum(pts_pred)) %>%
  group_by(lineup, position) %>%
  mutate(n = n()) %>%
  select(lineup, position, n, lineup_pts) %>%
  distinct() %>%
  spread(key=position, value=n) %>%
  filter(RB >= 2, TE >= 1, WR >= 3) %>%
  mutate(flex = case_when(RB==3 ~ 'RB',
                          TE==2 ~ 'TE',
                          WR==4 ~ 'WR')) %>%
  group_by(flex) %>%
  dplyr::summarize(median_pts = round(median(lineup_pts), 3),
                   cases = n()) %>%
  knitr::kable() %>%
  kable_styling(full_width = FALSE)
flex median_pts cases
RB 141.072 9584
WR 143.601 416
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd)) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs Uncertainty',
          subtitle = 'Pareto Lineups Bolded')

psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
5042 136.81 4.80 Kyler Murray ARI QB 25.86 0.96 8400
Ezekiel Elliott DAL RB 19.68 0.31 9000
Jonathan Taylor IND RB 16.16 0.16 6700
Kenyan Drake ARI RB 14.72 0.23 6500
Amari Cooper DAL WR 13.66 0.27 7000
Julian Edelman NEP WR 13.59 0.55 6500
DK Metcalf SEA WR 14.81 1.96 6500
Jordan Reed SFO TE 10.19 0.21 5300
Tampa Bay Buccaneers TBB DST 8.15 0.15 3800
8642 137.75 4.88 Kyler Murray ARI QB 25.06 0.96 8400
Miles Sanders PHI RB 17.27 1.04 7400
Jonathan Taylor IND RB 16.29 0.16 6700
Kenyan Drake ARI RB 14.72 0.23 6500
DeAndre Hopkins ARI WR 19.04 1.13 8500
Amari Cooper DAL WR 13.60 0.27 7000
Julian Edelman NEP WR 14.18 0.55 6500
Dallas Goedert PHI TE 9.74 0.38 5200
Tampa Bay Buccaneers TBB DST 7.85 0.15 3800
6454 138.49 5.21 Kyler Murray ARI QB 26.33 0.96 8400
Austin Ekeler LAC RB 17.00 1.10 7500
Jonathan Taylor IND RB 16.04 0.16 6700
Kenyan Drake ARI RB 14.46 0.23 6500
DeAndre Hopkins ARI WR 18.00 1.13 8500
Tyler Lockett SEA WR 14.98 0.72 6800
Julian Edelman NEP WR 13.88 0.55 6500
Jordan Reed SFO TE 9.80 0.21 5300
Tampa Bay Buccaneers TBB DST 8.00 0.15 3800
7663 140.54 5.42 Kyler Murray ARI QB 26.62 0.96 8400
Ezekiel Elliott DAL RB 19.07 0.31 9000
Miles Sanders PHI RB 18.94 1.04 7400
Jonathan Taylor IND RB 16.13 0.16 6700
Amari Cooper DAL WR 13.86 0.27 7000
Tyler Lockett SEA WR 13.88 0.72 6800
Darius Slayton NYG WR 14.26 1.60 5500
Jordan Reed SFO TE 10.09 0.21 5300
Tampa Bay Buccaneers TBB DST 7.68 0.15 3800
9170 141.96 5.46 Cam Newton NEP QB 28.56 1.83 7700
Derrick Henry TEN RB 17.78 0.26 8200
Jonathan Taylor IND RB 16.14 0.16 6700
Kenyan Drake ARI RB 14.30 0.23 6500
DeAndre Hopkins ARI WR 20.41 1.13 8500
Terry McLaurin WAS WR 13.79 0.93 6700
Julian Edelman NEP WR 13.33 0.55 6500
Jordan Reed SFO TE 9.85 0.21 5300
Tampa Bay Buccaneers TBB DST 7.80 0.15 3800
5463 142.17 6.06 Kyler Murray ARI QB 27.39 0.96 8400
Miles Sanders PHI RB 18.99 1.04 7400
Jonathan Taylor IND RB 16.10 0.16 6700
Kenyan Drake ARI RB 14.47 0.23 6500
DeAndre Hopkins ARI WR 18.54 1.13 8500
Amari Cooper DAL WR 13.73 0.27 7000
Tyler Lockett SEA WR 13.85 0.72 6800
Jordan Reed SFO TE 9.99 0.21 5300
Cincinnati Bengals CIN DST 9.11 1.33 3300
7325 142.40 6.56 Kyler Murray ARI QB 26.75 0.96 8400
Miles Sanders PHI RB 16.92 1.04 7400
Jonathan Taylor IND RB 15.81 0.16 6700
Kenyan Drake ARI RB 14.15 0.23 6500
DeAndre Hopkins ARI WR 19.10 1.13 8500
Tyler Lockett SEA WR 14.83 0.72 6800
DK Metcalf SEA WR 17.31 1.96 6500
Jordan Reed SFO TE 9.77 0.21 5300
Tampa Bay Buccaneers TBB DST 7.76 0.15 3800
825 144.81 6.82 Cam Newton NEP QB 26.54 1.83 7700
Derrick Henry TEN RB 17.95 0.26 8200
Jonathan Taylor IND RB 16.07 0.16 6700
Kenyan Drake ARI RB 14.58 0.23 6500
DeAndre Hopkins ARI WR 18.62 1.13 8500
Tyler Lockett SEA WR 13.85 0.72 6800
DK Metcalf SEA WR 20.11 1.96 6500
Dallas Goedert PHI TE 9.43 0.38 5200
Tampa Bay Buccaneers TBB DST 7.66 0.15 3800
9769 146.10 7.07 Cam Newton NEP QB 26.78 1.83 7700
Ezekiel Elliott DAL RB 19.59 0.31 9000
Jonathan Taylor IND RB 16.09 0.16 6700
Kenyan Drake ARI RB 14.92 0.23 6500
DeAndre Hopkins ARI WR 18.79 1.13 8500
Tyler Lockett SEA WR 14.28 0.72 6800
Darius Slayton NYG WR 17.18 1.60 5500
T.J. Hockenson DET TE 10.61 0.94 5400
Tampa Bay Buccaneers TBB DST 7.87 0.15 3800
1525 146.73 7.96 Cam Newton NEP QB 27.86 1.83 7700
Derrick Henry TEN RB 17.57 0.26 8200
Jonathan Taylor IND RB 15.96 0.16 6700
Kenyan Drake ARI RB 14.49 0.23 6500
DeAndre Hopkins ARI WR 18.31 1.13 8500
DK Metcalf SEA WR 18.05 1.96 6500
Michael Gallup DAL WR 13.23 0.85 5700
Jordan Reed SFO TE 10.05 0.21 5300
Pittsburgh Steelers PIT DST 11.21 1.33 4700
1288 147.42 8.27 Kyler Murray ARI QB 25.84 0.96 8400
Miles Sanders PHI RB 17.04 1.04 7400
Jonathan Taylor IND RB 15.75 0.16 6700
Kenyan Drake ARI RB 14.39 0.23 6500
DeAndre Hopkins ARI WR 20.93 1.13 8500
Calvin Ridley ATL WR 20.88 1.90 8000
Darius Slayton NYG WR 14.21 1.60 5500
Jordan Reed SFO TE 9.76 0.21 5300
New York Giants NYG DST 8.63 1.04 3600
341 149.64 8.88 Cam Newton NEP QB 27.24 1.83 7700
Ezekiel Elliott DAL RB 19.70 0.31 9000
Austin Ekeler LAC RB 18.06 1.10 7500
Jonathan Taylor IND RB 16.09 0.16 6700
DeAndre Hopkins ARI WR 18.89 1.13 8500
DK Metcalf SEA WR 16.87 1.96 6500
Darius Slayton NYG WR 15.27 1.60 5500
Jordan Reed SFO TE 10.14 0.21 5300
Atlanta Falcons ATL DST 7.38 0.59 3200
5844 150.32 9.07 Cam Newton NEP QB 26.38 1.83 7700
Derrick Henry TEN RB 17.84 0.26 8200
Miles Sanders PHI RB 17.78 1.04 7400
Jonathan Taylor IND RB 16.01 0.16 6700
DeAndre Hopkins ARI WR 19.38 1.13 8500
DK Metcalf SEA WR 18.00 1.96 6500
Darius Slayton NYG WR 15.86 1.60 5500
T.J. Hockenson DET TE 11.08 0.94 5400
Tampa Bay Buccaneers TBB DST 7.99 0.15 3800
6253 153.74 9.20 Cam Newton NEP QB 27.19 1.83 7700
Ezekiel Elliott DAL RB 19.72 0.31 9000
Jonathan Taylor IND RB 16.06 0.16 6700
Kenyan Drake ARI RB 15.12 0.23 6500
DeAndre Hopkins ARI WR 18.99 1.13 8500
Tyler Lockett SEA WR 14.75 0.72 6800
N’Keal Harry NEP WR 23.57 3.74 5300
T.J. Hockenson DET TE 10.57 0.94 5400
Tampa Bay Buccaneers TBB DST 7.77 0.15 3800
4778 153.79 13.07 Cam Newton NEP QB 25.30 1.83 7700
Ezekiel Elliott DAL RB 19.46 0.31 9000
Miles Sanders PHI RB 17.96 1.04 7400
Jonathan Taylor IND RB 16.04 0.16 6700
Calvin Ridley ATL WR 18.71 1.90 8000
Darius Slayton NYG WR 16.32 1.60 5500
N’Keal Harry NEP WR 14.84 3.74 5300
Darren Waller LVR TE 17.36 2.34 6600
Tampa Bay Buccaneers TBB DST 7.81 0.15 3800